package com.lp.aop.aspectj;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;

/**
 * ClassName: AspectConfig
 * Description:
 * @since 1.0.0
 */
@Aspect
public class AspectConfig {
	/**
	 * 如何定义一个切点？
	 * 切点位置：com.xl.code 包下的所有class 的所有 test结尾的方法。
	 *
	 *
	 *        * com.xl.code..*.*Test(..)
	 *   * 不限定返回值
	 *   com.xl.code..*   com.xl.code下所有包
	 *   .*Test方法名以Test结尾
	 *   (..)  不限定参数
	 *
	 *
	 *
	 */
	@Pointcut(value = "execution(* com.lp.aop.aspectj..*.*Test(..))")
	public void test(){}


	/**
	 * 定义一个前置通知
	 */
	@Before(value = "test()")
	public void beforeAdvice() {
		System.out.println("before advice");
	}


	/**
	 * 定义一个后置通知
	 */
	@After(value = "test()")
	public void afterAdvice() {
		System.out.println("after advice");
	}


	/**
	 * 定义一个环绕通知,直接定义切点表达式
	 */
	@Around(value = "execution(* com.lp.aop.aspectj..*.*Test(..))")
	public void aroundAdvice(ProceedingJoinPoint joinPoint) {
		try {
			System.out.println("around advice begin");
			joinPoint.proceed();
			System.out.println("around advice end");
		} catch (Throwable throwable) {
			throwable.printStackTrace();
		}
	}



}
